package AccesoDatos;
import beans.Categoria;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import beans.Usuario;
import java.util.ArrayList;
import java.util.List;

public class UsuarioDA {
    
    // <editor-fold defaultstate="collapsed" desc="SINGLETON">
    private static UsuarioDA _instance = null;
    
    public static UsuarioDA GetInstance(){
        if (_instance == null){
            _instance = new UsuarioDA();
        }
        return _instance;
    }
    // </editor-fold>
        
    // <editor-fold defaultstate="collapsed" desc="VerificarAcceso">
    public Usuario VerificarAcceso(String correo, String password){
        Connection cnn = ConexionDA.GetConexion();
        Usuario usuario = null;
        try{
            CallableStatement cst = cnn.prepareCall("{call PA_USUARIO_VALIDARACCESO(?,?)}");
            cst.setString(1, correo);
            cst.setString(2, password);
            ResultSet tabla = cst.executeQuery();
            
            if(tabla.next()){
                usuario = new Usuario();
                usuario.setId(tabla.getInt("n_usuario_id"));
                usuario.setNombres(tabla.getString("s_usu_nombres"));
                usuario.setApellidos(tabla.getString("s_usu_apellidos"));
                usuario.setSexo(tabla.getString("s_usu_sexo"));
                usuario.setFechanacimiento(tabla.getDate("d_usu_fechanacimiento"));
                usuario.setDireccion(tabla.getString("s_usu_direccion"));
                usuario.setCorreo(tabla.getString("s_usu_correo"));
                usuario.setPassword(tabla.getString("s_usu_password"));
                usuario.setCodigoPostal(tabla.getString("s_usu_codpostal"));
                usuario.setFoto(tabla.getString("s_usu_foto"));
                usuario.setSueldo(tabla.getFloat("n_usu_sueldo"));
                
                usuario.setListaCategorias(this.getCategoriasByUsuario(usuario.getId()));
            }
        }catch(Exception e){
            e.printStackTrace();
        }
        return usuario;
    }
    
     // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="Insertar Usuario">
    public Integer InsertarUsuario(Usuario usuario) throws Exception{
        Connection cn = ConexionDA.GetConexion();
            int resp = 0;
            try{
                
                CallableStatement cst = cn.prepareCall("{call PA_INSERT_USUARIO(?,?,?,?,?,?,?,?,?,?)}");
                //PreparedStatement stm = cn.prepareStatement(consulta);
                cst.registerOutParameter(1, java.sql.Types.INTEGER);
                cst.setString(2, usuario.getNombres());
                cst.setString(3, usuario.getApellidos());
                cst.setString(4, usuario.getSexo());
                cst.setDate(5, usuario.getFechanacimiento());
                cst.setString(6, usuario.getDireccion());
                cst.setString(7, usuario.getCorreo());
                cst.setString(8, usuario.getCodigoPostal());
                cst.setString(9, usuario.getPassword());
                cst.setString(10, usuario.getFoto());
                
                cst.executeUpdate();           
                resp = cst.getInt(1);

            }catch(Exception ex){

            }finally{
                cn.close();
            }
            return resp;
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="getCategoriasByUsuario">
    public List<Categoria> getCategoriasByUsuario(int n_usuario_id) throws Exception{
        Connection cnn = ConexionDA.GetConexion();
        List<Categoria> listaCategorias = new ArrayList<Categoria>();
        try{
            CallableStatement cst = cnn.prepareCall("{call PA_GET_CATEGORIAS_X_USUARIO(?)}");
            cst.setInt(1, n_usuario_id);
            
            ResultSet tabla = cst.executeQuery();
            
            Categoria categoria = null;
            while(tabla.next()){
                categoria = new Categoria();
                categoria.setCode(tabla.getString("s_cat_code"));
                categoria.setDescription(tabla.getString("s_cat_descripcion"));
                listaCategorias.add(categoria);
            }
        }catch(Exception e){
            e.printStackTrace();
        }
        return listaCategorias;
    }
    
     // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="Actualizar Usuario">
    public boolean ActualizarUsuario(Usuario usuario) throws Exception{
        Connection cn = ConexionDA.GetConexion();
            boolean ok=false;
            try{
                
                CallableStatement cst = cn.prepareCall("{call PA_UPDATE_USUARIO(?,?,?,?,?,?,?,?,?)}");
                //PreparedStatement stm = cn.prepareStatement(consulta);
                cst.setInt(1, usuario.getId());
                cst.setString(2, usuario.getNombres());
                cst.setString(3, usuario.getApellidos());
                cst.setString(4, usuario.getSexo());
                cst.setDate(5, usuario.getFechanacimiento());
                cst.setString(6, usuario.getDireccion());
                cst.setString(7, usuario.getCodigoPostal());
                cst.setString(8, usuario.getCorreo());                
                cst.setFloat(9, usuario.getSueldo());
                                
                cst.executeUpdate();           
                ok = true;

            }catch(Exception ex){
                ok = false;
            }finally{
                cn.close();
                
            }
            return ok;
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="ActualizarUsuarioXML">
     public int ActualizarUsuarioXML(String xml, int n_usuario_id) throws Exception{
        Connection cn = ConexionDA.GetConexion();
        int resultado = 0;
        try{            
            CallableStatement cmd = cn.prepareCall("{call PA_UPDATE_USUARIO_XML(?,?,?)}");            
            cmd.setString(1, xml);
            cmd.registerOutParameter(2, java.sql.Types.INTEGER);
            cmd.setInt(3, n_usuario_id);
            
            cmd.executeUpdate();
            resultado = cmd.getInt(2);
        }catch(Exception e){
        }
        
        return resultado;
     }
            
     // </editor-fold>
}
